#include "../2_source/HTTP/http.hpp"
#include <signal.h>
#include <unistd.h>

// 大文件传输
int main()
{
    Socket cil_socket;
    cil_socket.CreateClient(8084,"127.0.0.1");
    string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\n";
    string body;
    Util::ReadFile("./hello.txt", &body);
    req += "Content-Length: " + to_string(body.size()) + "\r\n\r\n" ;


    assert(cil_socket.Send(req.c_str(), req.size()) != -1);
    char buffer[1024] = {0};
    assert(cil_socket.Recv(buffer,1023));
    DBG_LOG("%s", buffer);
    sleep(3);
    
    cil_socket.Close();


    return 0;
}

// // 一次发送多个请求
// int main()
// {
//     Socket cil_socket;
//     cil_socket.CreateClient(8084,"127.0.0.1");
//     string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     req += "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     req += "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";

//     while(1)
//     {
//         assert(cil_socket.Send(req.c_str(), req.size()) != -1);
//         char buffer[1024] = {0};
//         assert(cil_socket.Recv(buffer,1023));
//         DBG_LOG("%s", buffer);
//         sleep(3);
//     }
//     cil_socket.Close();


//     return 0;
// }


// // 业务处理超时，查看服务器处理情况
// // 当服务器达到一个性能瓶颈，再一次业务处理中花费了太长的时间（超过了服务器设置的非活跃超时时间）
// // 1. 在一次业务处理中耗费太长的时间，导致其他的连接也被连累超时，其他链接很有可能会被拖累到超时释放
// // 假设1 2 3 4 5描述符就绪了，在处理1的时候花费了30s处理完，超时了，导致2 3 4 5描述符因为长时间没有刷新活跃度
// // 接下来有两种情况：
// //      1.如果接下来的描述符都是通信描述符，如果都就绪了，则都不会受影响，因为接下来会处理并刷新活跃度
// //      2.如果接下来的2号描述符是定时器事件描述符，定时器触发超时，执行定时任务，就会将3 4 5描述符释放掉，
// //        一旦3 4 5描述符对应的连接被释放了，接下来处理3 4 5 的事件时，就会导致程序崩溃（内存访问错误）
// //  因此在本次事件处理时，并不能直接对连接进行释放，而应该将释放操作压入到任务池，等到事件处理完了执行任务池中的任务时，再进行释放
// int main()
// {
//     signal(SIGCHLD, SIG_IGN);
//     for(int i = 0; i < 10; ++i)
//     {
//         pid_t pid = fork();
//         if(pid < 0 )
//         {
//             DBG_LOG("fork error");
//             return -1;
//         }
//         else if(pid == 0)
//         {
//             Socket cil_socket;
//             cil_socket.CreateClient(8084,"127.0.0.1");
//             string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//             while(1)
//             {
//                 assert(cil_socket.Send(req.c_str(), req.size()) != -1);
//                 char buffer[1024] = {0};
//                 assert(cil_socket.Recv(buffer,1023));
//                 DBG_LOG("%s", buffer);
                
//             }
//             cil_socket.Close();
//             exit(0);
//         }
//     }
//     while(true) sleep(1);
//     return 0;
// }



// // 给服务器发送数据，告诉服务器要发送1024个字节的数据，但是实际发送的数据并不足1024，查看服务器处理结果
// // 1.如果数据只发送了一次，服务器将得不到完整的请求，就不会进行业务处理，客户端也就都得不到响应，最终超时关闭连接
// // 2.连着给服务器发送多次小的请求，服务器会将后面的请求当做前面请求的正文进行处理，而后面处理的时候就有可能因为处理错误而关闭连接
// int main()
// {
//     Socket cil_socket;
//     cil_socket.CreateClient(8084,"127.0.0.1");
//     string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 100\r\n\r\nhello world!!!";
//     while(1)
//     {
//         assert(cil_socket.Send(req.c_str(), req.size()) != -1);
//         assert(cil_socket.Send(req.c_str(), req.size()) != -1);
//         assert(cil_socket.Send(req.c_str(), req.size()) != -1);

//         char buffer[1024] = {0};
//         assert(cil_socket.Recv(buffer,1023));
//         DBG_LOG("%s", buffer);
//         sleep(3);
//     }
//     cil_socket.Close();


//     return 0;
// }


// // 超时链接测试：客户端给服务器发送请求，发送一次之后，建立很长一段时间后才再次发送，看服务器是否会正常的超时连接关闭
// int main()
// {
//     Socket cil_socket;
//     cil_socket.CreateClient(8084,"127.0.0.1");
//     string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     while(1)
//     {
//         assert(cil_socket.Send(req.c_str(), req.size()) != -1);
//         char buffer[1024] = {0};
//         assert(cil_socket.Recv(buffer,1023));
//         DBG_LOG("%s", buffer);
//         sleep(15);
//     }
//     cil_socket.Close();


//     return 0;
// }


// // 长链接测试：发送一个长链接请求，一直发送请求，读取响应，看看服务器是否会异常
// int main()
// {
//     Socket cil_socket;
//     cil_socket.CreateClient(8084,"127.0.0.1");
//     string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
//     while(1)
//     {
//         assert(cil_socket.Send(req.c_str(), req.size()) != -1);
//         char buffer[1024] = {0};
//         assert(cil_socket.Recv(buffer,1023));
//         DBG_LOG("%s", buffer);
//         sleep(3);
//     }
//     cil_socket.Close();


//     return 0;
// }